package com.qm.annotation;

import java.lang.reflect.Field;

/**
 * @Author: wb
 * @CreateTime: 2022-11-18  08:42
 * @Description: java 注解
 * 注解（Annotation）是在 Java 1.5 时引入的概念，同 class 和 interface 一样，
 * 也属于一种类型。注解提供了一系列数据用来装饰程序代码（类、方法、字段等），但是注解并不是所装饰代码的一部分，
 * 它对代码的运行效果没有直接影响，由编译器决定该执行哪些操作。
 */
@MyAnno
public class MyTest2 {
    @MyAnnoField
    private String name;

    @MyAnnoField("青芒")
    private String school;

    public String getName() {
        return name;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyTest2{" +
                "name='" + name + '\'' +
                ", school='" + school + '\'' +
                '}';
    }

    public static void main(String[] args) {

        try {
            // 获取 class 类
            Class<?> objectClass = Class.forName("com.qm.annotation.MyTest2");
            // 获取实例
            Object o = objectClass.newInstance();
            // 获取方法

            for (Field field : objectClass.getDeclaredFields()) {
                // 设置属性可以访问
                field.setAccessible(true);
                if (field.isAnnotationPresent(MyAnnoField.class)) {
                    MyAnnoField annotation = field.getAnnotation(MyAnnoField.class);
                    String value = annotation.value();
                    field.set(o,value);
                }
            }
            System.out.println(o);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
